package com.example.common.recycler.viewbinding;

import android.view.View;

import androidx.annotation.NonNull;
import androidx.viewbinding.ViewBinding;

import com.example.common.recycler.base.BaseBindView;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 每种数据类型对应的BindView基类(适用于视图绑定)
 * 用户只需继承此类并实现抽象方法即可
 * 满足一个尸实体类对应多种布局的情况
 *
 * @param <T>  与视图对应的实体类
 * @param <VB> 视图绑定类
 */
public abstract class BaseViewBindingBindView2<T, VB extends ViewBinding> extends BaseBindView<T, ViewBindingViewHolder<VB>> {
    public Type viewBindingType; //存放泛型T的实际类型

    public BaseViewBindingBindView2() {
        super();
        viewBindingType = getViewBindingType(getClass());
    }
    /**
     * 获得视图绑定类实例
     * 例如：
     * public XxxBinding getBinding(@NonNull View itemView, Xxx item){
     *      XxxBinding.bind(itemView);
     * }
     *
     * @param itemView 需要被绑定的视图
     * @param item     <T>的实例对象
     * @return
     */
    public abstract VB getBinding(@NonNull View itemView, T item);

    /**
     * 获得布局资源id
     *
     * @param item <T>的实例对象，用户可以据此对象返回不同的布局，满足一个实体对应多种布局的情况（如聊天场景）
     * @return
     */
    public abstract int getItemLayoutResId(T item);

    /**
     * 获得VB泛型的实际类型
     *
     * @param subclass
     * @return
     */
    public Type getViewBindingType(Class<?> subclass) {
        Type superclass = subclass.getGenericSuperclass();
        if (superclass instanceof Class) {
            throw new RuntimeException("Missing type parameter.");
        }
        ParameterizedType parameterized = (ParameterizedType) superclass;
        return parameterized.getActualTypeArguments()[1];
    }

}